package com.freemypay.test.并发.编码的变体;

/**
 * 自管理的Runnable
 * Thread构造器为Thread对象赋值，可通过getName().toString()获取
 * @author yesixian
 * @date 2018年5月11日
 */
public class SelfManaged implements Runnable {
	private int countDown = 5;
	private Thread t = new Thread(this);
	
	/*
	 * 构造方法中启动线程貌似有点问题，因为如果构造方法未执行完成，线程已经启动
	 * ，该线程可访问未稳定状态的对象。
	 * 这是优选Executor而不是显示的创建Thread的另一个原因。
	 */
	public SelfManaged() {
		t.start();
	}

	public String toString() {
		return Thread.currentThread().getName() + 
				"(" + countDown + ")."; 
	}
	
	@Override
	public void run() {
		while(true) {
			System.out.println(this);
			if(--countDown == 0)
				return;
		}
	}
	
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			 new SelfManaged();
		}
	}

}
